// #ifndef _THREAD_HPP__
// #define _THREAD_HPP__
// #endif
#pragma once
#include<iostream>
#include<string>
#include<functional>
#include <sys/types.h>
#include <unistd.h>


//v2
namespace thr
{
static int num = 1;
enum TSAT
{
    NEW,//新创建的线程
    START,//启动的
    STOP//停止的
};
template<class T>
class Thread
{
    using func_t = std::function<void(T)>;
private:
    //这是一个成员方法-其实还有一个this参数,
    static void* run(void* args)
    {
        Thread<T>* t = static_cast<Thread<T>*>(args);
        t->_func(t->_data);
        return nullptr;
    }
    void pthrdeta()//设置为分离
    {
        _joinab = false;
    }

public:
    Thread(func_t func,T data):_data(data),_func(func),_stat(NEW),_joinab(true)
    {
        _name += "thread-"+std::to_string(num++);
        _pid = getpid();
    }
    //线程启动
    bool stat()
    {
        if(_stat != START)
        {
            int n = ::pthread_create(&_tid,nullptr,run,this);
            if(n != 0)return false;
            _stat = START;
            return true;
        }
        return false;
    }
    //退出方法，线程取消
    bool stop()
    {
        if(_stat == START)
        {
            int n = ::pthread_cancel(_tid);
            if(n != 0)return false;
            _stat = STOP;
            return true;
        }
        return false;
    }
    //等待回收线程
    bool join()
    {
        if(_joinab)
        {
            int n = pthread_join(_tid,nullptr);
            if(n != 0)return false;
            _stat = STOP;
            return true;
        }
        return false;
    }
    //线程分离
    void detach()
    {
        pthrdeta();
        pthread_detach(_tid);
    }
    //查看是否分离
    bool pthrjoin()
    {
        return _joinab;
    }
    //获取名称
    std::string Name(){return _name;}
    ~Thread()
    {}
private:
    std::string _name;//线程名称
    pthread_t _tid;//线程id
    pid_t _pid;//进程id--线程属于那个进程
    bool _joinab;//是否是分离的--默认不是
    func_t _func;//执行的任务

    TSAT _stat;//线程状态
    T _data;
};
}












//v1

// namespace thr
// {
//     using func_t = std::function<void()>;
// static int num = 1;
// enum TSAT
// {
//     NEW,//新创建的线程
//     START,//启动的
//     STOP//停止的
// };
// class Thread
// {
// private:
//     //这是一个成员方法-其实还有一个this参数,
//     static void* run(void* args)
//     {
//         Thread* t = static_cast<Thread*>(args);
//         t->_func();
//         return nullptr;
//     }
//     void pthrdeta()//设置为分离
//     {
//         _joinab = false;
//     }

// public:
//     Thread(func_t func):_func(func),_stat(NEW),_joinab(true)
//     {
//         _name += "thread-"+std::to_string(num++);
//         _pid = getpid();
//     }
//     //线程启动
//     bool stat()
//     {
//         if(_stat != START)
//         {
//             int n = ::pthread_create(&_tid,nullptr,run,this);
//             if(n != 0)return false;
//             _stat = START;
//             return true;
//         }
//         return false;
//     }
//     //退出方法，线程取消
//     bool stop()
//     {
//         if(_stat == START)
//         {
//             int n = ::pthread_cancel(_tid);
//             if(n != 0)return false;
//             _stat = STOP;
//             return true;
//         }
//         return false;
//     }
//     //等待回收线程
//     bool join()
//     {
//         if(_joinab)
//         {
//             int n = pthread_join(_tid,nullptr);
//             if(n != 0)return false;
//             _stat = STOP;
//             return true;
//         }
//         return false;
//     }
//     //线程分离
//     void detach()
//     {
//         pthrdeta();
//         pthread_detach(_tid);
//     }
//     //查看是否分离
//     bool pthrjoin()
//     {
//         return _joinab;
//     }
//     //获取名称
//     std::string Name(){return _name;}
//     ~Thread()
//     {}
// private:
//     std::string _name;//线程名称
//     pthread_t _tid;//线程id
//     pid_t _pid;//进程id--线程属于那个进程
//     bool _joinab;//是否是分离的--默认不是
//     func_t _func;//执行的任务

//     TSAT _stat;//线程状态
// };
// }
